iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

設計模式系列 第 11

Day11 - 組合模式(Composite pattern)

  • 分享至 

  • xImage
  •  

介紹
組合模式將多個物件組成樹狀結構(tree),並讓使用者透過單一介面來操作這些組合物件。

C++範例

#include <iostream>
#include <memory>
#include <vector>

class Sprite
{
public:
    virtual void ShowName() const = 0;
    virtual ~Sprite() {}
};

class Monster : public Sprite
{
public:
    void ShowName() const
    {
        std::cout << "monster" << std::endl;
    }
};

class CompositeSprite : public Sprite
{
public:
    void ShowName() const
    {
        for (std::shared_ptr<Sprite> s : m_SpriteList)
        {
            s->ShowName();
        }
    }

    void AddSprite(std::shared_ptr<Sprite> spSprite)
    {
        m_SpriteList.push_back(spSprite);
    }

private:
    std::vector<std::shared_ptr<Sprite>> m_SpriteList;
};

int main()
{
    // 創建三個怪物物件
    const std::shared_ptr<Monster> monster1 = std::make_shared<Monster>();
    const std::shared_ptr<Monster> monster2 = std::make_shared<Monster>();
    const std::shared_ptr<Monster> monster3 = std::make_shared<Monster>();

    // 創建可含其他怪物容器的容器
    const std::shared_ptr<CompositeSprite> sprite1 = std::make_shared<CompositeSprite>();

    // 創建怪物容器
    const std::shared_ptr<CompositeSprite> sprite2 = std::make_shared<CompositeSprite>();
    const std::shared_ptr<CompositeSprite> sprite3 = std::make_shared<CompositeSprite>();

    // 將怪物物件加入怪物容器
    sprite2->AddSprite(monster1);
    sprite2->AddSprite(monster2);
    sprite3->AddSprite(monster3);

    // 將怪物容器加入怪物容器
    sprite1->AddSprite(sprite2);
    sprite1->AddSprite(sprite3);

    // 印出怪物資訊 (內部會一層層印出怪物資訊)
    sprite1->ShowName();

    return 0;
}

Output:

monster
monster
monster

上一篇
Day10 - 外觀模式(Facade pattern)
下一篇
Day12 - 裝飾者模式(Decorator pattern)
系列文
設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言